<?php
// +----------------------------------------------------------------------
// |          用 户 A P I 文 件         2020-05-07 08:00:00
// +----------------------------------------------------------------------
// |     Auth:绳俊辉        E-mail:mail@owap.cn      QQ:1807931872
// +----------------------------------------------------------------------

namespace app\api\controller;

use think\Db;

use think\Config;

class User
{
    /*
    *   应用初始化
    *   @desc 应用启动时会访问
    *   @return 应用配置信息
    */ 
    public function index($key=null,$version=null)//应用初始函数
    {
        if(!$key){return api_go(-1,'Error!缺少参数!');}
        if($key!=Config('info.key')){return api_go(-1,'数据异常,初始化失败!');}
        if(!Config('info.software')['sate']){return api_go(-1,Config('info.software')['sate_text']);}
        $verinfo = Config('info.software')['version'];
        $info = Config('info.software');
        if(in_array($version,$info['version']))
        {
            $data = [
            'up_msg'=>$info['upmsg'],
            'up_http'=>$info['uphttp'],
            'version'=>$info['version'][0],
            'up_type'=>$info['uptype']
            ];
            return api_go(0,'',$data);
        }else{
            return api_go(-1,'不受支持的版本!');
        }
    }

    /*
    *   用户登录
    *   @desc 根据账号密码进行登录操作
    *   @return 返回用户账户信息
    */
    public function login($user=null,$pass=null,$key=null,$machine=null,$version=null)//用户登录函数
    {
        if(!$user||!$pass||!$key||!$machine){return api_go(-1,'缺少参数!');}
        $info = Db::name('software')->where('key',$key)->find();
        if($info)
        {
            $info = null;
            $info = Db::name('user')->where('username',$user)->find();
            if($info)
            {
                if(md5($pass)==$info['password'])
                {
                    if($info['sate']!=1){api_log('用户登录','登录失败!被封禁账号尝试登录!操作IP:'.$ip,$user);return api_go(-1,'账号已被封禁!请联系组长获取封禁详情!');}
                    $ip = get_client_ip();
                    $city = get_ip_city($ip);
                    $token = Gotoken(36);
                    $data = [
                        'name'=>$info['name'],
                        'group'=>$info['group'],
                        'token'=>$token,
                        'ip'=>$ip,
                        'city'=>$city
                    ];
                    $updata = [
                        'machine'=>$machine,
                        'logip'=>$ip,
                        'logcity'=>$city,
                        'logtime'=>time(),
                        'token'=>$token,
                        'token_end'=>time()+130,
                        'logversion'=>$version
                    ];
                    Db::name('user')->where('username',$user)->update($updata);
                    $cityof = strpos($city,'河南省');
                    $cityoftext = '';
                    if($cityof<1){
                        $cityoftext = '  检测结果:异地登录!';
                    }
                    api_log('用户登录','登录成功!IP:'.$ip.' 所在地:'.$city.$cityoftext,$user,$user);
                    return api_go(0,'登录成功!登录地:'.$city.$cityoftext,$data);
                }else{
                    api_log('用户登录','登录失败!身份比对失败!操作IP:'.$ip,$user,$user);
                    return api_go(-1,'Error!身份比对失败,校验码错误!');
                }
            }else{
                api_log('用户登录','登录失败!账号未被授权!操作IP:'.$ip,$user,$user);
                return api_go(-1,'未授权,请联系组长授权!');
            }
        }else{
            api_log('用户登录','登录失败!通信密钥错误!操作IP:'.$ip,$user,$user);
            return api_go(-1,'Error,参数异常!');
        }
    }

    /*
    *   保持在线,俗称心跳
    *   @desc 根据用户的Token和用户名对身份过期时间进行延期
    *   @return 返回心跳状态
    */
    public function heart($user=null,$token=null,$jaip=null)//保持在线
    {
        if(!$user||!$token){return api_go(-1,'身份异常!');}
        $info = Db::name('user')->where('username',$user)->find();
        if($info)
        {
            if($info['sate']!=1){return api_go(-1,'用户已被封禁!');}
            if(!$info['token']){return api_go(-1,'该账号已被强制下线!');}
            if($info['token']!=$token){return api_go(-1,'身份验证过期,请重新登录!');}
            if($info['token_end'] < time()){return api_go(-1,'身份过期,请重新登录!');}
            $data = ['token_end'=>time()+370,'jaip'=>$jaip];
            $info = Db::name('user')->where('username',$user)->update($data);
            if($info)
            {
                return api_go(0,'心跳完成!');
            }else{
                #api_log('保持在线','心跳失败!数据未能写入!',$user,$user);
                return api_go(0,'心跳失败!');
            }
        }else{
            return api_go(-1,'账户异常!');
        }
    }

    /*
    *   用户注册
    *   @desc 通过对传入的Post数据进行分析判断,完成用户注册
    *   @return 返回用户注册状态
    */
    public function reg($user=null,$pass=null,$name=null,$group=null)//注册
    {
        if(!$user||!$pass||!$name||!$group){return api_go(-1,'缺少参数!');}
        $info = Db::name('user')->where('username',$user)->find();
        if($info){return api_go(-1,'用户已存在!');}
        $ip = get_client_ip();
        $data = [
            'username'=>$user,
            'password'=>$pass,
            'name'=>$name,
            'group'=>$group,
            'sate'=>0,
            'regip'=>$ip,
            'regtime'=>time()
        ];
        $info = Db::name('user')->insert($data);
        if($info)
        {
            return api_go(0,'添加成功!');
        }else{
            return api_go(-1,'添加失败!错误码:Db_Err1001');
        }
    }

    /*
    *   读取信息-队列接口列表
    *   @desc 需要用户端传入有效的token
    *   @return 返回队列接口的信息
    */
    public function loadzcid($token=null)//读取接口列表
    {
        if(!$token){return api_go(-1,'参数不足!');}
        $info = Db::name('user')->where('token',$token)->find();
        if($info){
            if($info['sate']!=1){
                Db::name('user')->where('token',$token)->update([
                    'token'=>null,
                    'token_end'=>0
                    ]);
                return api_go(-1,'账户异常!');
            }
            if($info['token_end'] < time()){
                Db::name('user')->where('token',$token)->update([
                    'token'=>null,
                    'token_end'=>0
                    ]);
                return api_go(-1,'身份过期,请重新登录!');
            }
            $data = Db::name('zcid')->select();
            return api_go(0,'读取成功!',$data);
        }else{
            return api_go(-1,'数据异常,需要重新登录!');
        }
        
    }
    /*
    *   读取对应人或对应组的信息
    *   @desc 需要传入token和list两个参数,判断是读取群组还是人员
    *   @return 返回对应的Json数据
    */
    public function loadnamebase($token=null,$list=null,$listid=null)//读取对应信息
    {
        if(!$token){return api_go(-1,'参数不足!');}
        $info = Db::name('user')->where('token',$token)->find();
        if(!$info){return api_go(-1,'数据异常,需要重新登录!');}
        if($info['sate']!=1){return api_go(-1,'账户异常!');}
        if($info['token_end'] < time()){return api_go(-1,'身份过期,请重新登录!');}
        if($list==1)//群组
        {
            $info = Db::name('namebase')->where('listid',$listid)->column('group','zc_name');
            if($info)
            {
                return api_go(0,'读取成功!',$info);
            }
            return api_go(0,'读取失败!',$info);
        }else{//对应人
            $info = Db::name('namebase')->where('listid',$listid)->column('name','zc_name');
            if($info)
            {
                return api_go(0,'读取成功!',$info);
            }
            return api_go(0,'读取失败!',$info);
        }
    }

    /*
    *   退出登录
    *   @desc 根据token和用户名执行下线操作
    *   @return 如果传入信息正确,则下线该用户
    */
    public function logout($token=null,$user=null)
    {
        if(!$token||!$user){return api_go(-1,'参数不足!');}
        $info = Db::name('user')->where('username',$user)->find();
        if($info && $info['token']==$token)
        {
            $info = Db::name('user')->where('username',$user)->update(['token'=>null,'token_end'=>0]);
            if($info)
            {
                api_log('用户退出','用户:'.$user.'已成功下线!',$user,'');
            } 
        }
        
    }
}